package structstu

import (
	"fmt"
)


//定义struct
//同样大写才可以被其他文件访问
type Studnte struct {
	name string
	Age  int16 //内部的属性也是大写才能被访问
}

type Address struct {
	//城市
	city string
	//邮编
	mail int
}

type Employee struct {
	Address         //匿名结构
	stu     Studnte //非匿名使用
}

func Sh() {

	//变量
	var stu Studnte

	//赋值
	stu.Age = 18
	stu.name = "zs"

	//创建同时赋值
	ss := Studnte{name: "lisi", Age: 18}

	fmt.Printf("%#v \nage is %d\n%#v\n", stu, stu.Age, ss)

	//同样这种无法修改穿进去的原始对象
	//并且完全拷贝一个该对象耗费内存
	//所以即使不修改也传指针更合适(返回也是)
	change(stu, "zds", 18)
	fmt.Printf("修改后: %#v\n", stu)
	//传指针可以修改
	change2(&stu, "zds", 26)
	fmt.Printf("修改后: %#v\n", stu)

	ds := getDefaultStu()
	change2(ds, "新名称", 26)
	fmt.Printf("!!!! %#v\n", ds)

	//匿名struct
	var emp Employee
	//可以直接点匿名结构体内部属性 也可以.匿名结构体.属性
	emp.city = "北京"
	emp.Address.city = "上海"
	emp.stu = stu
	fmt.Println(emp)

}

//返回指针
func getDefaultStu() *Studnte {
	var rs Studnte
	rs.Age = 18
	rs.name = "佚名"
	return &rs
}

func change2(stu *Studnte, s string, age int16) {
	//不用*stu
	stu.Age = age
	stu.name = s
}

func change(stu Studnte, name string, age int16) {
	stu.name = name
	stu.Age = age
}
